/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package funcionesDeCruce;


import cromosomas.Arbol;
import cromosomas.CromosomaRuta;
import elementosEvolutivos.Cromosoma;
import elementosEvolutivos.FuncCruce;
import util.Aleatorio;
/**
 *
 * @author Paco Torres
 */
public class CruceRutas implements FuncCruce{
        /*
        hijos[0] = crg1 con arbol mutado
        hijos[1] = crg2 con arbol mutado
        */
    public Cromosoma[] cruce(Cromosoma cr1, Cromosoma cr2) {
        CromosomaRuta crg1 = (CromosomaRuta)cr1;
        CromosomaRuta crg2 = (CromosomaRuta)cr2;
	CromosomaRuta[] hijos = new CromosomaRuta[2];
        
        /*extraemos subarbol de crg1*/
        double p3=(double)Aleatorio.getDoubleAleatorio();
        int posi = (int) Math.floor(p3 *crg1.getMaximoNodos());
        Arbol solfin=null;
        solfin=crg1.getGenotipo().getSubArbolInit(false,posi,crg1.getMaximoNodos());
        
         
        /*extraemos subarbol de crg2*/
        p3=(double)Aleatorio.getDoubleAleatorio();
        int posi2 = (int) Math.floor(p3 *crg1.getMaximoNodos());
        Arbol solfin2=null;
        solfin2=crg2.getGenotipo().getSubArbolInit(false,posi2,crg2.getMaximoNodos());

        
        /*Insertamos los subarboles donde corresponda*/
        Arbol solAux=solfin2.clone();
        crg2.getGenotipo().setSubArbolInit(false,posi2,crg2.getGenotipo().getNum_nodos(),solfin);
        crg1.getGenotipo().setSubArbolInit(false,posi,crg1.getGenotipo().getNum_nodos(),solAux);
        
        crg1.setGenotipo(solAux);
        crg2.setGenotipo(solfin);
        
        crg1.getGenotipo().actualizarNumeroNodos();
        crg2.getGenotipo().actualizarNumeroNodos();
        
        hijos[0]=crg1;
        hijos[1]=crg2;
       return hijos;/*realmente nos da igual*/       
    }
}
